package handlers

import (
	"go-mgdms/internal/common/captcha"
	"go-mgdms/internal/common/config"
	"go-mgdms/internal/common/utils"
	"strings"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

// CaptchaHandler 验证码控制器
type CaptchaHandler struct {
	clickCaptcha *captcha.ClickCaptcha
}

// NewCaptchaHandler 创建验证码控制器实例
func NewCaptchaHandler(db *gorm.DB) *CaptchaHandler {
	// 从app.yaml读取验证码配置
	alpha, err := config.GetInt("app.captcha.alpha")
	if err != nil {
		alpha = 36 // 默认透明度
	}

	length, err := config.GetInt("app.captcha.length")
	if err != nil {
		length = 4 // 默认长度
	}

	confuseLength, err := config.GetInt("app.captcha.confuse_length")
	if err != nil {
		confuseLength = 2 // 默认混淆长度
	}

	// 创建配置映射
	captchaConfig := map[string]any{
		"alpha":          alpha,
		"length":         length,
		"confuse_length": confuseLength,
		"mode":           []string{"text", "icon"},
	}

	return &CaptchaHandler{
		clickCaptcha: captcha.NewClickCaptcha(db, captchaConfig),
	}
}

// GetClickCaptcha 获取点击验证码
func (h *CaptchaHandler) GetClickCaptcha(c *gin.Context) {
	// 获取ID参数
	id := c.Query("id")
	if id == "" {
		utils.Fail("缺少验证码ID参数").JSON(c)
		return
	}

	// 创建验证码
	result, err := h.clickCaptcha.Create(id)
	if err != nil {
		utils.Fail("创建验证码失败: " + err.Error()).JSON(c)
		return
	}

	// 返回结果
	utils.Success(result).JSON(c)
}

// VerifyClickCaptcha 验证点击验证码
func (h *CaptchaHandler) VerifyClickCaptcha(c *gin.Context) {
	var id, info string

	// 检查Content-Type，支持JSON和表单
	contentType := c.GetHeader("Content-Type")
	if strings.Contains(contentType, "application/json") {
		// JSON格式
		var req struct {
			ID   string `json:"id"`
			Info string `json:"info"`
		}
		if err := c.ShouldBindJSON(&req); err == nil {
			id = req.ID
			info = req.Info
		}
	} else {
		// 表单格式
		id = c.PostForm("id")
		info = c.PostForm("info")
	}

	// 检查参数
	if id == "" || info == "" {
		utils.Fail("缺少必要参数").JSON(c)
		return
	}

	result := h.clickCaptcha.Check(id, info, true)
	if !result {
		utils.Fail("验证失败").JSON(c)
		return
	}

	utils.Success(nil).JSON(c)
}
